package chap_01_CompletableFuture.step_02_CompletableFuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @Description 常用API汇总：获得结果和触发计算
 * @Author shihan
 * @Date 2022/9/4 12:49
 * @Version 1.0
 */
public class CompletableStudy_04_API_01 {

    public static void main(String[] args) {

        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "abc";
        });

        //getValue(completableFuture);

        testComplete(completableFuture);

    }

    /**
     * 主动触发计算
     *
     * @param completableFuture
     */
    private static void testComplete(CompletableFuture<String> completableFuture) {
        // complete 判断当前结果是否已经执行结束（不抛异常）：
        // 1、已结束则不更改已经执行的结果，并返回false；
        // 2、未结束则打断异步任务的执行，将 complete 的入参作为执行结果供 get、join 获取，并返回true
        System.out.println(completableFuture.complete("replace origin value") + " --》 " + completableFuture.join());
    }

    /**
     * 获取结果
     *
     * @param completableFuture
     */
    private static void getValue(CompletableFuture<String> completableFuture) {
        try {
            // 1、阻塞等待直到获取返回值，编译时抛异常
            System.out.println(completableFuture.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        try {
            // 2、阻塞等待指定时间，过时不候，编译时抛异常
            System.out.println(completableFuture.get(2, TimeUnit.SECONDS));
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        // 3、阻塞等待直到获取返回值，编译时不抛异常，运行时仍然抛异常
        System.out.println(completableFuture.join());
        // 4、触发 getNow 方法调用时，如果返回值还没有，则使用 valueIfAbsent 的缺省值
        System.out.println(completableFuture.getNow("absent default value"));
    }

}
